import Snake from "./Snake";
import Food from "./Food";
import ScorePanel from "./ScorePanel";
// 游戏控制器  控制所有类
class GameControl {
    // 定义三个属性
    snake: Snake;
    food: Food;
    scorePanel: ScorePanel;
    // 创建一个属性用来设置蛇的移动方向 也就是按键的方向
    direction: string = '';
    // 创建一个属性用来记录游戏是否结束
    isLive = true;
    constructor() {
        // 蛇
        this.snake = new Snake();
        // 食物
        this.food = new Food();
        // 记分牌
        this.scorePanel = new ScorePanel();
        // 游戏开始
        this.Init()
    }
    // 游戏的初始化方法，调用后游戏即开始
    Init() {
        // 绑定键盘按下的事件
        document.addEventListener('keydown', this.keydownHandler.bind(this))
        // 调用蛇的run方法
        this.run();

    }
    // 创建一个键盘按下的相应函数

    keydownHandler(event: KeyboardEvent) {
        // 获取按下键盘的key
        /**
         * ArrowUp      上
           ArrowDown    下
           ArrowLeft    左
           ArrowRight   右
         */
        // 用户是否按了正确的方向键
        // 修改direction属性
        this.direction = event.key;
    }

    // 创建蛇移动的方法
    run() {
        /***
         * 根据方向direction 来使蛇的位置改变
         * 向上  top  减少
         * 向下  top  增加 
         * 向左  left  减少 
         * 向右  left  增加
         * 
         * 
         */
        // 获取蛇现在的坐标
        let X = this.snake.x;
        let Y = this.snake.y;
        /**
        * ArrowUp      上
          ArrowDown    下
          ArrowLeft    左
          ArrowRight   右
        */
        //    根据按间的方向修改x、y值
        switch (this.direction) {
            case "ArrowUp":
            case "Up":
                // 向上移动 top  减少
                Y -= 10;
                break;
            case "ArrowDown":
            case "Down":
                Y += 10;
                break;

            case "ArrowLeft":
            case "Left":
                X -= 10;
                break;
            case "ArrowRight":
            case "Right":
                X += 10;
                break;

        }
        // 检查蛇是否吃到了食物
        this.checkEat(X, Y);
        try {
            this.snake.x = X;
            this.snake.y = Y;
        }
        catch (e) {
            alert(e + ",GAME OVER!");
            this.isLive = false;
        }
        this.isLive && setTimeout(this.run.bind(this), 300 - (this.scorePanel.level - 1) * 30)
    }

    // 定义一个方法 用来检查蛇是否吃到了食物
    checkEat(x: number, y: number) {
        if (x === this.food.x && y === this.food.y) {
            console.log('吃到食物了');
            // 食物的位置重新进行设置
            this.food.change();
            // 分数要增加
            this.scorePanel.addScore();
            // 蛇增加一节
            this.snake.addBody()
        }
    }
}

export default GameControl